home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 December / PCWDEC07.iso / Software / Freeware / FlashGot 0.6.4 / chrome / flashgot.jar / content / flashgot / flashgotOptions.js < prev    next >
Encoding:
Text File  |  2007-08-29  |  14.8 KB  |  503 lines

  1. /***** BEGIN LICENSE BLOCK *****
  2.  
  3.     FlashGot - a Firefox extension for external download managers integration
  4.     Copyright (C) 2004-2006 Giorgio Maone - g.maone@informaction.com
  5.  
  6. ***** END LICENSE BLOCK *****/
  7.  
  8. const g_rxOpt=/^(inv|)opt-(.*)/;
  9. var g_downloadManagers = null;
  10. var g_opts = null;
  11. var g_extList = null;
  12. var g_extText = null;
  13. var g_referrerRadio = null;
  14. var g_referrerText = null;
  15. var g_tmpDir = null;
  16. var g_wellGetPath = null;
  17.  
  18. var g_cust = gFlashGotService && {
  19.   dummy: gFlashGotService.createCustomDM(""),
  20.   map: {},
  21.   createEntry: function(obj,isNew) {
  22.     if(!obj.custom) return null;
  23.     const name=obj.name;
  24.     const map=this.map;
  25.     return map[name] ? map[name]
  26.       : map[name]={
  27.           _dirty: false,
  28.           _deleted: false, 
  29.           _new: isNew,
  30.           supported: true,
  31.           name: name,
  32.           argsTemplate: obj.argsTemplate,
  33.           exeFile: isNew?obj.locateExeFile(name):obj.exeFile
  34.         };
  35.   },
  36.   get current() {
  37.     if(!g_downloadManagers.selectedItem) return null;
  38.     const dmName=g_downloadManagers.selectedItem.getAttribute("label");
  39.     
  40.     if( (!dmName) || dmName=="---") return null;
  41.     var dm = gFlashGotService.DMS[dmName];
  42.     if(dm) {
  43.       return this.createEntry(dm,false);
  44.     }
  45.     this.dummy.name=dmName;
  46.     return this.createEntry(this.dummy,true);
  47.   },
  48.   add: function() {
  49.     const ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"
  50.       ].getService(Components.interfaces.nsIPromptService);
  51.     const ret={ value: "" };
  52.     const title=gFlashGotService.getString("custom.new.title");
  53.     var name;
  54.     if(ps.prompt(window,
  55.           title,
  56.           gFlashGotService.getString("custom.new.text"),
  57.           ret, null, {}) && 
  58.        (name = ret.value) ) {
  59.       if(/,|^(?:\d+|\s+|---)$/.test(name) ||
  60.           gFlashGotService.DMS[name] || this.map[name]) {
  61.         ps.alert(window,title,gFlashGotService.getString("custom.new.error"));
  62.         return;
  63.       }
  64.       const dummy = this.dummy;
  65.       dummy.name = name;
  66.       this.createEntry(dummy, true);
  67.       fgo_populateDMS(name);
  68.     }
  69.   },
  70.   remove: function() {
  71.     var dm=this.current;
  72.     if(dm) {
  73.       dm._deleted=true;
  74.       fgo_populateDMS();
  75.     }
  76.   },
  77.   locateExe: function() {
  78.     const cur=this.current;
  79.     if(cur) {
  80.       var f=this.dummy.locateExeFile(this.current.name);
  81.       if(f) {
  82.         cur.exeFile=f;
  83.         cur._dirty=true;
  84.       }
  85.       this.syncUI();
  86.     }
  87.   }
  88. ,
  89.   argsChanged: function(txtArgs) {
  90.     const cur=this.current;
  91.     var val=txtArgs.value.replace(/['"`]/g,'');
  92.     if(val!=txtArgs.value) {
  93.       document.getElementById("quoteWarn").showPopup(txtArgs,-1, -1, "tooltip", "topleft", "bottomleft");
  94.       selEnd=txtArgs.selectionEnd;
  95.       txtArgs.value=val;
  96.       try {
  97.         txtArgs.selectionEnd=selEnd-1;
  98.       } catch(ex) {}
  99.     }
  100.     if(cur && cur.argsTemplate!=val) {
  101.       cur.argsTemplate=val;
  102.       cur._dirty=true;
  103.     }
  104.   }
  105. ,
  106.   syncUI: function() {
  107.     var dm = this.current;
  108.     document.getElementById("dmsdeck").setAttribute(
  109.       "selectedIndex", dm ? "0" : "1");
  110.     if(dm) {
  111.       document.getElementById("customDM-exeFile").value = 
  112.         dm.exeFile ? dm.exeFile.path : "";
  113.       document.getElementById("customDM-args").value = dm.argsTemplate;
  114.       var ph=document.getElementById("ph-");
  115.       var popup=ph.parentNode;
  116.       while(ph.nextSibling) {
  117.         popup.removeChild(ph.nextSibling);
  118.       }
  119.       const PHS=this.dummy.PLACEHOLDERS;
  120.       if(PHS) {
  121.         var phName;
  122.         for(var j=0, len=PHS.length; j<len; j++) {
  123.           phName=PHS[j];
  124.           ph=ph.cloneNode(true);
  125.           ph.removeAttribute("hidden");
  126.           ph.setAttribute("id","ph-"+phName);
  127.           ph.setAttribute("label",gFlashGotService.getString("ph."+phName));
  128.           popup.appendChild(ph);
  129.         }
  130.       }
  131.     }
  132.   }
  133. ,
  134.  insertPH: function(id) {
  135.    const phName="["+id.substring(3)+"]";
  136.    const txtArgs=document.getElementById("customDM-args")
  137.    var selStart=txtArgs.selectionStart;
  138.    var selEnd=txtArgs.selectionEnd;
  139.    txtArgs.value=txtArgs.value.substring(0,selStart)+phName+txtArgs.value.substring(selEnd);
  140.    txtArgs.selectionStart=txtArgs.selectionEnd=selStart+phName.length;
  141.  }
  142. ,
  143.  save: function() {
  144.    const map=this.map;
  145.    var dm,target;
  146.    for(var name in map) {
  147.      dm=map[name];
  148.      target=null;
  149.      if(dm._deleted) {
  150.        gFlashGotService.removeCustomDM(name);
  151.      } else if(dm._new) {
  152.        target = gFlashGotService.createCustomDM(name);
  153.      } else if(dm._dirty) {
  154.        target = gFlashGotService.DMS[name];
  155.      }
  156.      if(target) {
  157.        target.argsTemplate=dm.argsTemplate;
  158.        target.exeFile=dm.exeFile;
  159.      }
  160.    }
  161.  }
  162. };
  163. function fgo_onload() {
  164.   if(!gFlashGotService) {
  165.     document.getElementById("mainTabbox").setAttribute("hidden","true");
  166.     document.getElementById("badInstall").removeAttribute("hidden");
  167.     document.getAnonymousElementByAttribute(document
  168.             .getElementById("flashgotOptions"),"dlgtype","cancel")
  169.             .setAttribute("hidden","true");
  170.     return;
  171.   }
  172.   
  173.   try {
  174.       g_wellGetPath = gFlashGotService.prefs.getComplexValue("WellGet.path", Components.interfaces.nsILocalFile);
  175.       document.getElementById("wellget-text").value = g_wellGetPath.path;
  176.   } catch(ex) {}
  177.    
  178.   
  179.   if(gFlashGotService.mailer) { 
  180.     // Thunderbird will handle "simple" clicks through Firefox
  181.     document.getElementById("tab-downloads").setAttribute("collapsed","true");
  182.   }
  183.   
  184.   g_downloadManagers=document.getElementById("downloadManagers");
  185.   g_opts=document.getElementsByTagName("checkbox");
  186.   
  187.   fgo_populateDMS();
  188.   
  189.   var j,len;
  190.   
  191.   g_extList = document.getElementById("ext-list");
  192.   g_extText = document.getElementById("ext-text");
  193.   g_extList.removeItemAt(0);
  194.   var extensions=gFlashGotService.extensions;
  195.   for(j=0, len=extensions.length; j<len; j++) {
  196.     g_extList.appendItem(extensions[j],extensions[j]);
  197.   }
  198.   
  199.   fgo_visitCheckboxes(
  200.     function(prefName,inverse,checkbox) {
  201.       var val=gFlashGotService.getPref(prefName);
  202.       checkbox.checked=inverse?!val:val;
  203.     }
  204.   );
  205.   
  206.   g_referrerRadio=document.getElementById("referrer-radio");
  207.   g_referrerText=document.getElementById("referrer-text");
  208.   g_referrerRadio.selectedIndex=gFlashGotService.getPref("autoReferrer")?0:1;
  209.   g_referrerText.value=gFlashGotService.getPref("fakeReferrer","");
  210.   fgo_syncReferrer();
  211.   g_referrerRadio.addEventListener("select", fgo_syncReferrer, true);
  212.   
  213.   
  214.   g_downloadManagers.addEventListener("popuphidden", fgo_syncDMOptions, true);
  215.   try {
  216.     g_tmpDir = gFlashGotService.prefs.getComplexValue("tmpDir", Components.interfaces.nsILocalFile);
  217.   } catch(ex) {
  218.      g_tmpDir = gFlashGotService.tmpDir.parent;
  219.   }
  220.   if(g_tmpDir) {
  221.     document.getElementById("tmpdir-text").value =g_tmpDir.path;
  222.   }
  223.   
  224.   document.getElementById("interception-rg").selectedItem=
  225.     document.getElementById("intercept"+
  226.       (gFlashGotService.getPref("interceptAll")?"All":"Ext")+"-radio");
  227. }
  228.  
  229. function fgo_populateDMS(name) {
  230.   const defaultDM=gFlashGotService.defaultDM;
  231.   const dms=gFlashGotService.DMS;
  232.   const dmList=[].concat(gFlashGotService.DMS);
  233.  
  234.   const map=g_cust.map;
  235.   var dm;
  236.   for(p in map) {
  237.     dm=map[p];
  238.     if( ! (dm._deleted || p in dms) ) {
  239.       dmList.push(map[p]);
  240.     }
  241.   }
  242.   
  243.   if(!name) name=defaultDM;
  244.   
  245.   var j,len,menuItem;
  246.   
  247.   g_downloadManagers.removeAllItems();
  248.   g_downloadManagers.selectedItem=null;
  249.   
  250.   var custom;
  251.   var found=false;
  252.   for(j=0,len=dmList.length; j<len; j++) {
  253.     dm=dmList[j];
  254.     if((custom=g_cust.createEntry(dm,false)) && custom._deleted) {
  255.       continue;
  256.     }
  257.     
  258.     menuItem=g_downloadManagers.appendItem(dm.name,dm.codeName);
  259.     
  260.     if(dm.supported) {
  261.       if(!found) {
  262.         found = (name == dm.name);
  263.         if(found || !g_downloadManagers.selectedItem) {
  264.           g_downloadManagers.selectedItem=menuItem;
  265.         }
  266.       }
  267.     } else {
  268.       if(!dm.shouldList()) menuItem.setAttribute("disabled","true");
  269.     }
  270.   }
  271.   
  272.   
  273.   if(g_downloadManagers.selectedItem) {
  274.     document.getElementById("nodms").setAttribute("collapsed","true");
  275.   } else {
  276.     g_downloadManagers.selectedItem=g_downloadManagers.appendItem("---",null);
  277.     document.getElementById("nodms").removeAttribute("collapsed");
  278.   }
  279.   
  280.   fgo_syncDMOptions();
  281. }
  282.  
  283. function fgo_interceptionSelected(rg) {
  284.   document.getElementById('extensions-box').style.visibility=
  285.     rg.selectedItem && rg.selectedItem.id=='interceptAll-radio' ? "hidden":"visible";
  286. }
  287.  
  288. function fgo_syncDMOptions() {
  289.   const dmrx = g_downloadManagers.value ?
  290.     new RegExp("\\b" + g_downloadManagers.value + "\\b")
  291.     :null;
  292.   const dmopts = document.getElementsByAttribute("class", "dm-opt");
  293.   var dmid, dmopt;
  294.   for(var j = dmopts.length; j-->0;) {
  295.     dmopt = dmopts[j];
  296.     if(dmrx) {
  297.       dmid = dmopt.id;
  298.       if(dmid) {
  299.         dmopt.setAttribute("hidden", dmid.match(dmrx) ? "false" : "true" );
  300.       }
  301.     } else {
  302.       dmopt.setAttribute("hidden", "true" );
  303.     }
  304.   }
  305.   var dmName = fgo_currentDmName();
  306.   document.getElementById("shownInContextMenu").checked = dmName && ((dmName in shownInContextMenu) 
  307.     ? shownInContextMenu[dmName] : gFlashGotService.DMS[dmName].shownInContextMenu);
  308.  
  309.   g_cust.syncUI();
  310. }
  311.  
  312. function fgo_syncReferrer() {
  313.   if(g_referrerRadio.selectedIndex == 1) {
  314.     g_referrerText.removeAttribute("disabled");
  315.   } else {
  316.     g_referrerText.setAttribute("disabled","true");
  317.   }
  318. }
  319. function fgo_enable(id,enabled) {
  320.   var b=document.getElementById(id);
  321.   if(enabled) {
  322.     b.removeAttribute("disabled");
  323.   } else {
  324.      b.setAttribute("disabled","true");
  325.   }
  326. }
  327.  
  328. function fgo_extText_changed() {
  329.   var enable;
  330.   var value=g_extText.value;
  331.   if((!g_extText.disabled) &&
  332.     /^[\w\-]+$/.test(value)) {
  333.       enable=true;
  334.       for(var j=g_extList.getRowCount();
  335.           j-- >0 && (enable=g_extList.getItemAtIndex(j).value!=value)
  336.           ;);
  337.   } else {
  338.      enable=false;
  339.   }
  340.   fgo_enable("ext-add-button", enable);
  341. }
  342.  
  343. function fgo_extList_changed() {
  344.   fgo_enable("ext-remove-button",
  345.     g_extList.selectedCount>0);
  346.   fgo_extText_changed();
  347. }
  348.  
  349. function fgo_ext_add() {
  350.   g_extList.appendItem(g_extText.value,g_extText.value);
  351.   fgo_extText_changed();
  352. }
  353.  
  354. function fgo_ext_remove() {
  355.   const selectedItems=g_extList.selectedItems;
  356.   for(var j=selectedItems.length; j-->0;) {
  357.     g_extList.removeItemAt(g_extList.getIndexOfItem(selectedItems[j]));
  358.   }
  359. }
  360.  
  361. function fgo_currentDmName() {
  362.   var dmName;
  363.   return g_downloadManagers.selectedItem && (dmName = g_downloadManagers.selectedItem.getAttribute("label"))
  364.     && gFlashGotService.DMS[dmName] && gFlashGotService.DMS[dmName].supported && dmName || null;
  365.  }
  366.  
  367. function fgo_save() {
  368.   if(!gFlashGotService) return true;
  369.   
  370.   fgo_visitCheckboxes(
  371.     function(prefName,inverse,checkbox) {
  372.       gFlashGotService.setPref(prefName,inverse ?! checkbox.checked : checkbox.checked);
  373.     }
  374.   );
  375.   
  376.   g_cust.save();
  377.   
  378.   
  379.   var dmName;
  380.   for(dmName in shownInContextMenu) {
  381.     gFlashGotService.DMS[dmName].shownInContextMenu = shownInContextMenu[dmName];
  382.   }
  383.   
  384.   dmName = fgo_currentDmName();
  385.   if(dmName) {
  386.     gFlashGotService.defaultDM = dmName;
  387.   }
  388.   
  389.   const extensions=[];
  390.   var j;
  391.   for(j = g_extList.getRowCount(); j-->0;) {
  392.     extensions[extensions.length]=g_extList.getItemAtIndex(j).value;
  393.   }
  394.   gFlashGotService.extensions=extensions;
  395.   gFlashGotService.setPref("autoReferrer",g_referrerRadio.value=="true");
  396.   gFlashGotService.setPref("fakeReferrer",g_referrerText.value);
  397.   if(g_tmpDir) gFlashGotService.prefs.setComplexValue("tmpDir", Components.interfaces.nsILocalFile, g_tmpDir);
  398.   gFlashGotService.setPref("interceptAll",document.getElementById("interceptAll-radio").selected);
  399.   try {
  400.     if(g_wellGetPath) {
  401.       gFlashGotService.prefs.setComplexValue("WellGet.path", Components.interfaces.nsILocalFile, g_wellGetPath); 
  402.     } else {
  403.       if(gFlashGotService.prefs.prefHasUserValue("WellGet.path")) gFlashGotService.prefs.clearUserPref("WellGet.path");
  404.     }
  405.   } catch(ex) {
  406.     dump(ex);
  407.   }
  408.   gFlashGotService.savePrefs();
  409.   return true;
  410.   
  411. }
  412.  
  413. function fgo_visitCheckboxes(callback) {
  414.   var j,checkbox,match;
  415.   for(j=g_opts.length; j-->0;) {
  416.     checkbox=g_opts[j];
  417.     if((match = checkbox.id.match(g_rxOpt))) {
  418.       callback(match[2],match[1]=="inv",checkbox);
  419.     }
  420.   }
  421. }
  422.  
  423.  
  424. function fgo_showLog() {
  425.   try {
  426.     window.opener.open(Components.classes['@mozilla.org/network/io-service;1'
  427.       ].getService(Components.interfaces.nsIIOService
  428.       ).newFileURI(gFlashGotService.logFile).spec, "_blank",
  429.       "scrollbars=yes,menubar=yes,titlebar=yes,resizable=yes");
  430.   } catch(ex) { dump(ex.message); }
  431. }
  432.  
  433.  
  434. function fgo_clearLog() {
  435.   gFlashGotService.clearLog();
  436. }
  437.  
  438. function fgo_browseTmpDir() {
  439.   const cc=Components.classes;
  440.   const ci=Components.interfaces;
  441.   const fp = cc["@mozilla.org/filepicker;1"].createInstance(ci.nsIFilePicker);
  442.   const title="FlashGot - "+document.getElementById("tmpdir-label").value;
  443.   fp.init(window, title, ci.nsIFilePicker.modeGetFolder);
  444.   try {
  445.     fp.displayDirectory = g_tmpDir == null ? gFlashGotService.tmpDir.parent : g_tmpDir;
  446.   } catch (ex) { gFlashGotService.log(ex); }
  447.   fp.appendFilters(ci.nsIFilePicker.filterAll);
  448.   if (fp.show()==ci.nsIFilePicker.returnOK) {
  449.     g_tmpDir = fp.file.QueryInterface(ci.nsILocalFile);
  450.     document.getElementById("tmpdir-text").value = g_tmpDir.path;
  451.     document.getElementById("tmpdir-warning").style.visibility="visible";
  452.   }
  453. }
  454.  
  455. function fgo_browseWellGet(reset) {
  456.   if(reset) {
  457.     g_wellGetPath = null;
  458.     document.getElementById("wellget-text").value = "";
  459.     return;
  460.   }
  461.   const cc=Components.classes;
  462.   const ci=Components.interfaces;
  463.   const fp = cc["@mozilla.org/filepicker;1"].createInstance(ci.nsIFilePicker);
  464.   const title="FlashGot - "+document.getElementById("wellget-label").value;
  465.   fp.init(window, title, ci.nsIFilePicker.modeOpen);
  466.   fp.appendFilters(ci.nsIFilePicker.filterApps);
  467.   if(!g_wellGetPath) {
  468.     g_wellGetPath = gFlashGotService.profDir.clone();
  469.     g_wellGetPath.QueryInterface(Components.interfaces.nsILocalFile)
  470.                 .initWithPath(g_wellGetPath.path.substring(0,3));
  471.     g_wellGetPath.append("WellGet.exe");
  472.   }
  473.   try {
  474.     fp.displayDirectory = g_wellGetPath.parent;
  475.     fp.defaultString = g_wellGetPath.leafName;
  476.   } catch (ex) { gFlashGotService.log(ex); }
  477.  
  478.   if (fp.show() == ci.nsIFilePicker.returnOK) {
  479.     var f = fp.file.QueryInterface(ci.nsILocalFile);
  480.     if(!(f.exists() && f.isExecutable() &&
  481.         f.path.substring(0,1).toUpperCase() == 
  482.         gFlashGotService.profDir.path.substring(0,1).toUpperCase())) {
  483.       Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  484.                 .getService(Components.interfaces.nsIPromptService)
  485.                 .alert(window, "FlashGot / WellGet", 
  486.                   gFlashGotService.getString("wellget.mustBeSameDrive", 
  487.                             [f.path.substring(0,1)]));
  488.       return;
  489.     }
  490.     g_wellGetPath = f;
  491.     document.getElementById("wellget-text").value = f.path;
  492.     gFlashGotService.DMS["WellGet"]._supported = null;
  493.   }
  494. }
  495.  
  496. var shownInContextMenu = {};
  497. function fgo_shownInContextMenuClicked(cbx) {
  498.   var dmName = fgo_currentDmName();
  499.   if(dmName) shownInContextMenu[dmName] = cbx.checked;
  500. }
  501.  
  502.  
  503.